home *** CD-ROM | disk | FTP | other *** search
- #
- # universelle Make-Prozedur
- #
- # für alle Module wird eine Abhängigkeit von einer
- # eventuellen Gesamtprojekt-Includedatei und eventuellen modulspezifischen
- # Includedateien, die denselben Namen wie das Modul tragen, angenommen.
- #
- # lauffähig erst ab Interpreterversion 2.01
- #
- # (c) P.Vranken, 4.6.1992
- #
- # Bemerkungen: Da auf konsequente Anwendung von "" verzichtet wurde, ist
- # darauf zu achten, daß keine Variablen des Namens c, h, o, s, cll, mke u.a.
- # verwendet werden. Außerdem müssen Pfade und Optionen natürlich korrekt
- # angepaßt werden.
-
- func set_options()
- #
- # hier die gewünschten Optionen angeben
- #
- # Programmname:
- let programm$ = "programm.prg"
- # Module (ohne .C) und ihre Anzahl eintragen:
- let anz_module = 3
- let modul$[1] = "main"
- let modul$[2] = "up_1"
- let modul$[3] = "up_2"
- # Gesamtprojekt-Include:
- let include$ = "gen_inc.h"
- # Compiler:
- let cc$ = "\usr\bin\cc.prg"
- let cc_optionen$ = "-xyz -inc=\usr\include"
- # Linker:
- let cl$ = "\usr\bin\cl.prg"
- let cl_optionen$ = '-o=programm$ -lib=\usr\lib\'
- let cl_library$ = "float.lib std.lib tos.lib"
- endfunc
-
- func cc_comline(); # hier wird die Compilerkommandozeile erzeugt
- let cc_com$ = cc_optionen$
- for t=1 to anz_module
- if istomake(modul$[t].o: modul$[t].c, modul$[t].h, include$, argv$[0].mke)
- let cc_com$ += ' modul$[t].c'
- endif
- next
- let cc_comline = strcmp('cc_optionen$', 'cc_com$')
- endfunc
-
- # es wird davon ausgegangen, daß der Binder als Eingabe auch eine Datei
- # verarbeiten kann, denn die in der Länge begrenzte Kommandozeile reicht
- # gewöhnlich nicht, um eine Reihe von Objektmodulen und Bibliotheken anzu-
- # geben.
- func cl_comfile(); # hier wird die Linkeranweisungsliste erstellt
- puts "Eine Datei mit Linkeranweisungen"
- OUT_TO modul$[1].cll
- puts cl_optionen$.
- for t=1 to anz_module
- puts modul$[t], ".o".
- next
- puts cl_library$.
- OUT_TO stdout
- puts " wurde erstellt:".
- shows modul$[1].cll
- endfunc
-
- func mustlink(); # muß der Linker aufgerufen werden?
- let mustlink = istomake(programm$: modul$[1].cll)
- for t=1 to anz_module
- let mustlink = mustlink || istomake(programm$: modul$[t].o)
- next
- endfunc
-
- #
- # Beginn des Hauptprogramms
- #
- warn_ver 201
- gosub set_options()
- putc " >>>>>> Makeprozedur zur Erzeugung von ", programm$, " <<<<<< ".
- putc DATE$.
-
- if istomake(modul$[1].cll: "standard.mke");# Linkeranweisungen müssen neu erzeugt werden
- del modul$[1].cll
- gosub cl_comfile()
- endif
-
- # Übersetzung, solange nötig
- while cc_comline(); # dann ist eine Übersetzung erforderlich
- putc "cc.prg ", cc_com$.
- del c_err
- out_to c_err; # Ausgabe umlenken
- cc$ cc_com$; # tcc aufrufen
- out_to stdout
- if RC; # es trat ein Fehler auf
- ed.prg c_err
- exit RC; # Editor mit Returncode!=0 verlassen => Prozedur abbrechen
- else
- showc c_err; # Warnungen anzeigen
- endif
- again
- #
- # Zusammenbinden, falls erforderlich
- #
- if mustlink()
- putc "cl.prg -inc=", modul$[1], ".cll".
- cl$ -inc=modul$[1].cll
- if RC; # Link-Fehler: Ausgabe anhalten, damit man die
- putc "eine Taste zum Fortfahren".
- gosub getchar(); # Meldung des Linkers lesen kann
- del programm$; # sonst können fehlerhafte Programme erzeugt werden
- else
- putc programm$, " wurde erzeugt".
- endif
- else
- putc programm$, " ist auf dem aktuellen Stand!".
- gosub getchar()
- endif
- end.
-